;Inteligencia Artificial II
;Practica 2 - Mapa
;Alfonso Sendra Gamero

(dribble-on practica_2_traza.txt)

(clear)

;plantilla para las ciudades
(deftemplate ciudad
	(slot nombre)
	(multislot norte)
	(multislot sur)
	(multislot oeste)
	(multislot este)
	(multislot sureste)
    (multislot suroeste)
    (multislot noreste)
    (multislot noroeste)
)

;hechos iniciales
(deffacts initial-fact
	(ciudad (nombre A) (norte D) (oeste B))
	(ciudad (nombre B) (norte E) (oeste C))
	(ciudad (nombre C) (norte F))
	(ciudad (nombre D) (norte G) (oeste E))
	(ciudad (nombre E) (norte H) (oeste F))
	(ciudad (nombre F) (norte I))
	(ciudad (nombre G) (oeste H))
	(ciudad (nombre H) (oeste I))
	(ciudad (nombre I))
)

(reset)

;regla para la transitividad de la relacion 'estar al norte'
(defrule norte
	?v1 <- (ciudad (nombre ?nombre) (norte $?norte))
	(ciudad (nombre ?nombreT) (norte $?norteT))
	(test (member$ ?nombreT $?norte))
	(test (not (subsetp $?norteT $?norte)))
	=>	(modify ?v1 (norte $?norte $?norteT))
)

;regla para calcular la relacion 'estar al sur' con transitividad
(defrule sur
	?v1 <- (ciudad (nombre ?nombre) (sur $?sur))
	(ciudad (nombre ?nombreT) (norte $?norte))
	(test (member$ ?nombre $?norte)) 
	(test (not (member ?nombreT $?sur)))
	=>	(modify ?v1 (sur $?sur ?nombreT))
	    (assert (loc sur ?nombre  ?nombreT))
	    (assert (loc norte ?nombreT  ?nombre))
)

;regla para la transitividad de la relacion 'estar al oeste'
(defrule oeste 
	?v1 <- (ciudad (nombre ?nombre) (oeste $?oeste))
	(ciudad (nombre ?nombreT) (oeste $?oesteT))
	(test (member$ ?nombreT $?oeste))
	(test (not (subsetp $?oesteT $?oeste)))
	=>	(modify ?v1 (oeste $?oeste $?oesteT))
)

;regla para calcular la relacion 'estar al este' con transitividad
(defrule este
	?v1 <- (ciudad (nombre ?nombre) (este $?este))
	(ciudad (nombre ?nombreT) (oeste $?oeste))
	(test (member$ ?nombre $?oeste)) 
	(test (not (member ?nombreT $?este)))
	=>	(modify ?v1 (este $?este ?nombreT))
		(assert (loc este ?nombre ?nombreT))
		(assert (loc oeste ?nombreT ?nombre))
)

;regla para calcular la relacion 'estar al suroeste' con transitividad
(defrule suroeste
	(declare (salience -1))
	?v1 <- (ciudad (nombre ?nombre) (suroeste $?suroeste))
	(ciudad (este $?este2) (sur $?sur2))
	(test (member ?nombre $?este2))
	(test (not (subsetp $?sur2 $?suroeste)))
	=> (modify ?v1 (suroeste $?suroeste $?sur2))
	   (progn$ (?field  $?sur2)
			(assert (loc suroeste ?nombre ?field)))	
)

;regla para calcular la relacion 'estar al sureste' con transitividad
(defrule sureste
	(declare (salience -1))
	?v1 <- (ciudad (nombre ?nombre) (sureste $?sureste))
	(ciudad (oeste $?oeste2) (sur $?sur2))
	(test (member ?nombre $?oeste2))
	(test (not (subsetp $?sur2 $?sureste)))
	=> (modify ?v1 (sureste $?sureste $?sur2))
	   (progn$ (?field  $?sur2)
			(assert (loc sureste ?nombre ?field)))		
)

;regla para calcular la relacion 'estar al noroeste' con transitividad
(defrule noroeste
	(declare (salience -1))
	?v1 <- (ciudad (nombre ?nombre) (noroeste $?noroeste))
	(ciudad (este $?este2) (norte $?nor2))
	(test (member ?nombre $?este2))
	(test (not (subsetp $?nor2 $?noroeste)))
	=> (modify ?v1 (noroeste $?noroeste $?nor2))
	   (progn$ (?field  $?nor2)
			(assert (loc noroeste ?nombre ?field)))	
)

;regla para calcular la relacion 'estar al noreste' con transitividad
(defrule noreste
	(declare (salience -1))
	?v1 <- (ciudad (nombre ?nombre) (noreste $?noreste))
	(ciudad (oeste $?oeste2) (norte $?nor2))
	(test (member ?nombre $?oeste2))
	(test (not (subsetp $?nor2 $?noreste)))
	=> (modify ?v1 (noreste $?noreste $?nor2))
	   (progn$ (?field  $?nor2)
			(assert (loc noreste ?nombre ?field)))	
)

(defrule situacion
    (situacion  ?ciudad_1 ?ciudad_2)
    (loc ?loc ?ciudad_1 ?ciudad_2)
    => (printout t ?ciudad_1 " esta al " ?loc " de " ?ciudad_2 crlf)
)

(assert (situacion E B))
(assert (situacion C G))
(assert (situacion G C))
(assert (situacion B H))

(run)

(dribble-off)	
